/*
 * Plantilla.java
 *
 * Copyright 2011 Universidad Francisco de Paula Santander (UFPS).
 * Todos los Derechos Reservados.
 * Creado el 05/11/2009, 11:23:38 AM
 */

package com.ufps.cuatro.modelo.representacion;

import com.ufps.cuatro.modelo.representacion.componente.Componente;
import com.ufps.cuatro.util.base.ObjectBase;
import java.util.ArrayList;

/**
 * <i><b>Plantilla:</b></i><p>Define un Grupo de Plantillas que se aplicarán al
 * Componente y su Contenido</p>.
 * 
 * @author Carlos A. Torres C. - Dolly E. Guerrero. <https://code.google.com/p/tesis4dor/>
 * @version 1.0 05/11/2009
 * @see ObjectBase
 */
public class Plantilla extends ObjectBase{
    private static final long serialVersionUID = 4650783171528970399L;
    
    private String strTitulo;
    private ArrayList<PlantillaComponente> objPlantillasComponentes;
    private ArrayList<Componente> objComponentesIncluidos;

    /**
     * Constructor por defecto
     */
    public Plantilla() {
        objComponentesIncluidos = new ArrayList<Componente>();
    }

    /**
     * Constructor que inicializa Propiedades Básicas.
     * @param id Propiedad utilizada para identificar el indice dentro de los archivos de
     * propiedades.
     * @param strTitulo Titulo de la Plantilla.
     */
    public Plantilla(int id, String strTitulo) {
        super(id);        
        this.strTitulo = strTitulo;
        objComponentesIncluidos = new ArrayList<Componente>();
    }        

    /**
     * Devuelve la Colección de Plantillas de Componentes asociadas a la Plantilla
     * padre.
     * @return Colección de Plantillas de Componentes asociadas a la Plantilla
     * padre.
     */
    public ArrayList<PlantillaComponente> getObjPlantillasComponentes() {
        return objPlantillasComponentes;
    }

    /**
     * Establece la Colección de Plantillas de Componentes asociadas a la Plantilla
     * padre.
     * @param objComponentes Colección de Plantillas de Componentes asociadas a la Plantilla
     * padre.
     */
    public void setObjPlantillasComponentes(ArrayList<PlantillaComponente> objComponentes) {
        this.objPlantillasComponentes = objComponentes;
    }

    /**
     * Devuelve el Titulo de la Plantilla.
     * @return Titulo de la Plantilla.
     */
    public String getStrTitulo() {
        return strTitulo;
    }

    /**
     * Establece el Titulo de la Plantilla.
     * @param strTitulo Titulo de la Plantilla.
     */
    public void setStrTitulo(String strTitulo) {
        this.strTitulo = strTitulo;
    }

    /**
     * Devuelve la Colección de <code>Componente</code> Incluidos.
     * @return Colección de <code>Componente</code> Incluidos.
     */
    public ArrayList<Componente> getObjComponentesIncluidos() {
        return objComponentesIncluidos;
    }

    /**
     * Establece la Colección de <code>Componente</code> Incluidos.
     * @param objComponentesIncluidos Colección de <code>Componente</code> Incluidos.
     */
    public void setObjComponentesIncluidos(ArrayList<Componente> objComponentesIncluidos) {
        this.objComponentesIncluidos = objComponentesIncluidos;
    }
    
    /**
     * Agrega un <code>Componente</code> a la Colección de Componentes incluidos
     * que representan la distribución actual siempre y cuando no haya sido incluido
     * previamente.
     * @param objComponenteIncluido <code>Componente</code>.
     * @return Estado que determina si el <code>Componente</code> ha sido agregado 
     * a la Colección de Componentes incluidos que representan la distribución actual.
     */
    public boolean agregarComponenteDistribuido(Componente objComponenteIncluido){
        try{
            return this.objComponentesIncluidos.contains(objComponenteIncluido) ?
                        false : this.objComponentesIncluidos.add(objComponenteIncluido);
        }catch(java.lang.NullPointerException ex){}
        return false;        
    }
    
    /**
     * Elimina un <code>Componente</code> a la Colección de Componentes incluidos
     * que representan la distribución actual.
     * @param objComponenteIncluido <code>Componente</code>.
     * @return Estado que determina si el <code>Componente</code> ha sido agregado 
     * a la Colección de Componentes incluidos que representan la distribución actual.
     */
    public boolean eliminarComponenteDistribuido(Componente objComponenteIncluido){
        return this.objComponentesIncluidos.remove(objComponenteIncluido);                
    }  
    
    @Override
    public String toString() {
        return "Plantilla " + id + " - Titulo: " + strTitulo;
    }

    @Override
    public int compareTo(Object o) {
        try{
            Plantilla obj = (Plantilla) o;
            if(this.id > obj.id)
                return 1;
            else if(this.id < obj.id)
                return -1;
            else
                return 0;
        }catch(java.lang.NullPointerException ex){}
        return 0;
    }

    @Override
    public Object clone() {
        Plantilla objClon = null;        
        //----------------------------------------------------------
        //Primero se Clona la Referencia Local
        //----------------------------------------------------------
        objClon = (Plantilla) super.clone();
        //----------------------------------------------------------
        //Ahora se hace la Clonación Profunda
        //----------------------------------------------------------        
        if(objPlantillasComponentes != null){
            ((Plantilla)objClon).setObjPlantillasComponentes((ArrayList<PlantillaComponente>)objPlantillasComponentes.clone());
        }
        return objClon;
    }
    
    
    
    
}
